/**
线程执行的时间有长短，保证线程同时结束
*/
package main

import (
	"fmt"
)

func calcNum(intChan, resChan chan int, exiChan chan bool) {
	for v := range intChan {
		flag := true
		for i := 2; i < v; i++ {
			if v%i == 0 {
				flag = false
			}
		}
		if flag {
			resChan <- v
		}
	}
	exiChan <- true
}

func main() {
	intChan := make(chan int, 1000)
	resChan := make(chan int, 1000)
	exiChan := make(chan bool, 8)
	for i := 0; i < 100; i++ {
		intChan <- i
	}
	close(intChan) // 管道关闭后仍然可以读数据，但是不能写数据   i , ok := <- inChan  当ok为false时，就表示读取完了
	for i := 0; i < 8; i++ {
		go calcNum(intChan, resChan, exiChan)
	}
	for i := 0; i < 8; i++ {
		<-exiChan //不在乎值 直接取出扔了
	}
	close(exiChan)
	//chan在for range 遍历时如果没有被关闭，会一直读值
	close(resChan)
	for v := range resChan {
		fmt.Println(v)
	}
}
